'''
目标函数：
    max z=4*x1+3*x2

约束条件
    2*x1+x2<=10
    x1+x2<=8
    x2<=7
    x1,x2>=0
'''
import numpy as np
from scipy.optimize import linprog
import matplotlib.pyplot as plt

'''
最简单的线性规划例子
c表示目标函数的系数矩阵，注意要对应每一个变量
A_up表示约束条件中，不等关系的系数矩阵，必须是二维，而且默认是小于等于的不等关系，如果题目是大于等于，则系数矩阵要取反
b_up表示约束关系的结果矩阵，一味
A_eq，b_eq表示约束条件中的相等关系，同理
bounds是一个元组，表示各个变量的取值范围，None表示无穷
linprog默认求的是最小值，如果要求最大值，则c取反，最后得到的答案再取反，注意这里的矩阵都要用np.array()
'''
c = np.array([4, 3])
A_ub = np.array([[2, 1], [1, 1]])
b_ub = np.array([10, 8])
x1_bounds = (0, None)
x2_bounds = (0, 7)
res = linprog(-c, A_ub=A_ub, b_ub=b_ub, bounds=(x1_bounds, x2_bounds))
print(res)
print(-res.fun)
'''
     fun: -26.0
 message: 'Optimization terminated successfully.'
     nit: 2
   slack: array([0., 0., 1.])
  status: 0
 success: True
       x: array([2., 6.])
'''
x0 = np.zeros(81)
x1 = np.arange(0, 8.1, 0.1)
x2 = []
x3 = []
x4 = []
for i in x1:
    x2.append(8 - i)
    x3.append(7)
    x4.append(10 - 2 * i)
plt.plot(x1, x2)
plt.plot(x1, x3)
plt.plot(x1, x4)
# 表示填充x1，x3和x0（横坐标）之间x1<=1的部分
# 通过各个部分分别填充得到这个线性规划图形
plt.fill_between(x1, x3, x0, where=x1 <= 1,color="blue")
plt.fill_between(x1, x2, x0, where=x1 >= 1,color="blue")
plt.fill_between(x1, x2, x0, where=x1 >= 2,color="white")
plt.fill_between(x1, x4, x0, where=x1 >= 2,color="blue")
plt.legend(['x2', 'x3', 'x4'])
# 设置坐标轴范围
plt.xlim(0, 10)
plt.ylim(0, 10)
plt.title('Title')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.show()
